import Doc from '~/components/layout/docs'
import Now from '~/components/text/now'
import { InlineCode } from '~/components/text/code'
import Link from '~/components/text/link'
import { TerminalInput } from '~/components/text/terminal'

export const meta = {
  title: "Now's Command Line Interface",
  description:
    'Using Now CLI to create new deployments or control existing ones',
  date: '09 Mar 2017',
  editUrl: 'pages/docs/v1/clients/now-cli.mdx',
  lastEdited: '2019-11-05T13:14:41.000Z'
}

The `now` CLI is the main interface to the Now platform.

It's available on macOS, Windows, and Linux via `npm`.

While the default behavior of `now` is to deploy, it also has a variety of sub
commands grouped by different concerns.

### Cloud Commands

The following are the most important commands in Now CLI:

| Syntax                                                  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <InlineCode noWrap>now [path] ...</InlineCode>          | When you invoke `now`, the files within the current directory will be uploaded to <Now color="#000" /> and a new deployment will be created.<br/><br/>After that, you'll instantly receive its URL so that you can share it with other people around the globe. <br/><br/> The `[path]` can either be a file (leads to a static deployment) or a directory (the deployment type will be determined depending on the contents). If you provide `[path]`, you'll need to use the parameter `--local-config=../now.json` or just `-A ../now.json` to tell the CLI where to read the configuration. <br/><br/> If you want to deploy multiple paths at once, [read this](#deploying-multiple-projects-at-once). |
| <InlineCode noWrap>now ls\|list [app]</InlineCode>      | Show a list of all deployments. If `[app]` is defined, it will only list the deployments under that namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| <InlineCode noWrap>now rm\|remove [id]</InlineCode>     | Remove a deployment from our platform. The `[id]` parameter can either be the URL of your deployment (e.g. `https://static-ytbbrhoggd.now.sh` or the hostname (e.g. `static-ytbbrhoggd.now.sh`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| <InlineCode noWrap>now ln\|alias [id][url]</InlineCode> | Let's you configure an alias for an existing deployment. You can read more about how to take the maximum of functionality out of this subcommand [here](/docs/v1/features/aliases).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| <InlineCode noWrap>now domains [name]</InlineCode>      | Allows you to manage your domain names directly from the command line (before using them as aliases with <InlineCode noWrap>now alias</InlineCode>). Read more about it [here](/docs/v1/features/aliases).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| <InlineCode noWrap>now certs [cmd]</InlineCode>         | By default, <Now color="#000" /> will automatically provision certificates for your deployments. Using this subcommand, you can see when they're expiring and upload your own ones ([read more](/docs/v1/features/certs)).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| <InlineCode noWrap>now secrets [name]</InlineCode>      | [Read more](/docs/v1/features/env-and-secrets).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| <InlineCode noWrap>now dns [name]</InlineCode>          | [Read more](/docs/features/dns).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |

#### Deploying Multiple Paths at Once

By default, running `now` will
deploy the current working directory. In order to deploy
a different path, pass it to
the command:

<TerminalInput>now [path]</TerminalInput>

In certain cases, however, you might want to deploy multiple
files or directories at once. This works the
same way – just pass more paths to the command:

<TerminalInput>now [path][path] ...</TerminalInput>

If you pass more than one path, all of them will be uploaded
and bundled into a single static deployment on the server. The
result will be a single URL.

### Administrative Commands

Manage your account straight from your terminal:

| Syntax                                                        | Description                                                                                                                                                                               |
| ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <InlineCode noWrap>now billing\|cc</InlineCode>               | Easily add or remove credits cards from your account and adjust billing methods.                                                                                                          |
| <InlineCode noWrap>now upgrade\|downgrade [plan]</InlineCode> | Switch your plan from within the command line interface. Even after the command is run, we don't require you to use a web interface. The whole process happens directly in your terminal. |

To show the list of subcommands and options in your terminal, run this command:

<TerminalInput>now help</TerminalInput>

## Selecting Files and Directories to Be Uploaded

<Now color="#000" /> uses the metafiles inside your project to determine which files and directories should be uploaded to our platform and which ones should be ignored:

- If `.gitignore` exists, we don't upload the contents that are defined in it
- If `.npmignore` exists, we don't upload the contents that are defined in it and ignore the existence of .gitignore
- If `.dockerignore` exists, we don't upload the contents that are defined in it and ignore the existence of .gitignore and .npmignore

But it will get a little tricky if you're using the `files` property inside `package.json`: In that case, we follow [npm](https://www.npmjs.com/)'s behavior. This means that if `files` exists (which as [per definition](https://docs.npmjs.com/files/package.json#files) defines which files **should** be uploaded), `.npmignore` will take precedence and have the final word on which items will be uploaded to <Now color="#000" />.

This means that if you want to specify a list of files that should **never be ignored** when it comes to now, you should either use the `now.files` (not `files`) property inside `package.json` or the `files` property inside `now.json`:

```
"files": [
  "hello.png",
  "dist"
]
```

You can learn more about how to use this property <Link href='/docs/features/configuration#"files"-(array)'>here</Link>.

export default ({ children }) => <Doc meta={meta}>{children}</Doc>
